package cn.jbolt.core.service;

import cn.jbolt.core.base.JBoltMsg;
import cn.jbolt.core.cache.JBoltTopnavCache;
import cn.jbolt.core.common.enums.JBoltSystemLogTargetType;
import cn.jbolt.core.common.enums.JBoltSystemLogType;
import cn.jbolt.core.kit.JBoltUserKit;
import cn.jbolt.core.model.Topnav;
import cn.jbolt.core.service.base.JBoltBaseService;
import com.jfinal.aop.Inject;
import com.jfinal.kit.Kv;
import com.jfinal.kit.Okv;
import com.jfinal.kit.Ret;
import com.jfinal.plugin.activerecord.Db;

import java.util.Collections;
import java.util.List;

/**
 *
 * @ClassName: TopnavService
 * @author: JFinal学院-小木
 * @date: 2020-08-28 00:48
 */
public class JBoltTopnavService extends JBoltBaseService<Topnav> {
	protected Topnav dao = new Topnav().dao();
	@Inject
	protected JBoltTopnavMenuService jboltTopnavMenuService;

	@Override
	protected Topnav dao() {
		return dao;
	}

	/**
	 * 后台管理list查询
	 *
	 * @param keywords
	 * @return
	 */
	public List<Topnav> getAdminList(String keywords) {
		return getCommonListByKeywords(keywords, "sort_rank", "asc", "name");
	}

	/**
	 * 保存
	 *
	 * @param topnav
	 * @return
	 */
	public Ret save(Topnav topnav) {
		return submit(topnav, false);
	}

	/**
	 * 保存
	 *
	 * @param topnav
	 * @return
	 */
	public Ret update(Topnav topnav) {
		return submit(topnav, true);
	}

	/**
	 * 提交
	 *
	 * @param topnav
	 * @param update
	 */
	public Ret submit(Topnav topnav, boolean update) {
		if (topnav == null || (!update && isOk(topnav.getId())) || (update && notOk(topnav.getId()))) {
			return fail(JBoltMsg.PARAM_ERROR);
		}
		if(notOk(topnav.getName())) {
			return fail("请输入正确的名称，可能含有敏感信息被拦截了");
		}
		if(update) {
			//更新时需要判断数据存在
			boolean dbExist=existsById(topnav.getId());
			if(!dbExist) {return fail(JBoltMsg.DATA_NOT_EXIST);}
		}
		boolean success = false;
		// save和update分别处理
		if (update) {
			if (existsName(topnav.getName(), topnav.getId())) {
				return fail(JBoltMsg.DATA_SAME_NAME_EXIST);
			}
			success = topnav.update();
		} else {
			if (existsName(topnav.getName(), -1)) {
				return fail(JBoltMsg.DATA_SAME_NAME_EXIST);
			}
			topnav.setSortRank(getNextSortRank());
			success = topnav.save();
		}
		if (success) {
			// 添加日志
			addSystemLog(topnav.getId(), JBoltUserKit.getUserId(),
					update ? JBoltSystemLogType.UPDATE.getValue() : JBoltSystemLogType.SAVE.getValue(),
					topnav.getName());
		}
		return ret(success);
	}

	/**
	 * 删除
	 *
	 * @param id
	 * @return
	 */
	public Ret delete(Long id) {
		Ret ret = deleteById(id, false);
		if (ret.isOk()) {
			Topnav topnav = ret.getAs("data");
			// 重新设置其他剩余顺序
			updateSortRankAfterDelete(topnav.getSortRank());
			// 删除menus配置
			jboltTopnavMenuService.deleteByTopnavId(id);
			// 添加日志
			addDeleteSystemLog(id, JBoltUserKit.getUserId(), topnav.getName());
		}
		return ret;
	}

	/**
	 * @Override public String checkInUse(Topnav topnav) { //这里用来覆盖 检测Topnav是否被其它表引用
	 *           return null; }
	 */

	/**
	 * 上移
	 *
	 * @param id
	 * @return
	 */
	public Ret up(Long id) {
		Topnav topnav = findById(id);
		if (topnav == null) {
			return fail("数据不存在或已被删除");
		}
		Integer rank = topnav.getSortRank();
		if (rank == null || rank <= 0) {
			return fail("顺序需要初始化");
		}
		if (rank == 1) {
			return fail("已经是第一个");
		}
		Topnav upTopnav = findFirst(Okv.by("sort_rank", rank - 1));
		if (upTopnav == null) {
			return fail("顺序需要初始化");
		}
		upTopnav.setSortRank(rank);
		topnav.setSortRank(rank - 1);

		upTopnav.update();
		topnav.update();
		return SUCCESS;
	}

	/**
	 * 下移
	 *
	 * @param id
	 * @return
	 */
	public Ret down(Long id) {
		Topnav topnav = findById(id);
		if (topnav == null) {
			return fail("数据不存在或已被删除");
		}
		Integer rank = topnav.getSortRank();
		if (rank == null || rank <= 0) {
			return fail("顺序需要初始化");
		}
		int max = getCount();
		if (rank == max) {
			return fail("已经是最后一个");
		}
		Topnav upTopnav = findFirst(Okv.by("sort_rank", rank + 1));
		if (upTopnav == null) {
			return fail("顺序需要初始化");
		}
		upTopnav.setSortRank(rank);
		topnav.setSortRank(rank + 1);

		upTopnav.update();
		topnav.update();
		return SUCCESS;
	}

	/**
	 * 初始化排序
	 */
	public Ret initRank() {
		List<Topnav> allList = findAll();
		if (allList.size() > 0) {
			for (int i = 0; i < allList.size(); i++) {
				allList.get(i).setSortRank(i + 1);
			}
			batchUpdate(allList);
			JBoltTopnavCache.me.removeEnableTopNavs();
			// 添加日志
			addUpdateSystemLog(null, JBoltUserKit.getUserId(), "所有数据",
					"的顺序:初始化所有");
		}
		return SUCCESS;
	}

	/**
	 * 切换禁用启用状态
	 *
	 * @param id
	 * @return
	 */
	public Ret toggleEnable(Long id) {
		// 说明:如果需要日志处理 就解开下面部分内容 如果不需要直接删掉即可
		Ret ret = toggleBoolean(id, ENABLE);
		if (ret.isOk()) {
			// 添加日志
			Topnav topnav = ret.getAs("data");
			addUpdateSystemLog(id, JBoltUserKit.getUserId(), topnav.getName(),
					"的启用状态:" + topnav.getEnable());
		}
		return ret;
	}

	@Override
	public String checkCanToggle(Topnav topnav, String column, Kv kv) {
		if (ENABLE.equals(column) && (topnav.getEnable() == null || !topnav.getEnable())) {
			boolean inUse = jboltTopnavMenuService.checkTopnavUsed(topnav.getId());
			if (!inUse) {
				return "此顶部导航尚未分配任何菜单";
			}
		}

		return null;
	}

	/**
	 * 获取启用的数据
	 *
	 * @return
	 */
	public List<Topnav> getEnableList() {
		return getCommonList(Okv.by(ENABLE, TRUE), "sort_rank", "asc");
	}

	/**
	 * 检测是否存在启用的topnav
	 *
	 * @return
	 */
	public boolean checkHasEnableTopnav() {
		return exists(ENABLE, TRUE);
	}

	/**
	 * 获取指定ids里enable=true的数据
	 *
	 * @param ids
	 * @return
	 */
	public List<Topnav> getEnableListByIds(List<Long> ids) {
		if (!isOk(ids)) {
			return Collections.emptyList();
		}
		return find(selectSql().inList(ID, ids).eq(ENABLE, TRUE).orderBySortRank());
	}

	@Override
	protected int systemLogTargetType() {
		return JBoltSystemLogTargetType.TOPNAV.getValue();
	}
	/**
	 * 清空一个topNav下的menus 设置为eable = false
	 * @param id
	 * @return
	 */
	public Ret clearMenus(Long id) {
		Topnav topnav = findById(id);
		if(topnav == null) {
			return fail(JBoltMsg.DATA_NOT_EXIST);
		}
		StringBuilder msgBuilder = new StringBuilder();
		boolean txSuccess = Db.tx(()->{
			Ret ret = jboltTopnavMenuService.clearTopnavMenus(id);
			if(ret.isFail()) {
				msgBuilder.append(ret.getStr("msg"));
				return false;
			}
			topnav.setEnable(false);
			return topnav.update();
		});
		return txSuccess?SUCCESS:(msgBuilder.length()==0?fail():fail(msgBuilder.toString()));
	}
	/**
	 * 清空所有topnav的menus关联 都设置为enable = false
	 * @return
	 */
	public Ret clearAllMenus() {
		List<Topnav> topnavs = findAll();
		if(notOk(topnavs)) {
			return fail("顶部导航尚未添加任何数据");
		}
		StringBuilder msgBuilder = new StringBuilder();
		boolean txSuccess = Db.tx(()->{
			Ret ret = jboltTopnavMenuService.clearAllTopnavMenus();
			if(ret.isFail()) {
				msgBuilder.append(ret.getStr("msg"));
				return false;
			}
			topnavs.forEach(nav->nav.setEnable(false));
			batchUpdate(topnavs);
			return true;
		});
		return txSuccess?SUCCESS:(msgBuilder.length()==0?fail():fail(msgBuilder.toString()));
	}
}
